package dados.matricula;
import java.io.Serializable;

import negocio.aluno.Aluno;
import negocio.curso.Curso;
import negocio.matricula.Matricula;


public class RepositorioMatriculasArray implements Serializable{
	
	private Matricula[] matriculas;
	private int indice;
	private final static int tamanhoCache = 100;
	
	public RepositorioMatriculasArray(){
		indice = 0;
		matriculas = new Matricula[tamanhoCache];
	}
	
	public Matricula[] getMatriculas() {
		return matriculas;
	}

	public int getIndice() {
		return indice;
	}

	public int procurarIndice(int numero) throws MatriculaNaoExistenteException{
		int indice=0;
		boolean achou = false;
		for (Matricula matricula : matriculas) {
			if (matricula != null && matricula.getNumero() == numero) {
				achou = true;
				break;
			}
			else {
				indice++;
			}
		}
		if (achou) {
			return indice;
		} 
		else {
			throw new MatriculaNaoExistenteException();
		}
	}
	
	public void inserir(Matricula matricula) throws MatriculasSemCapacidadeArmazenamentoException{

		if (indice < tamanhoCache) {
			matriculas[indice] = matricula;
			indice++;
		} else {
			throw new MatriculasSemCapacidadeArmazenamentoException();
		}
	}
	
	public void inserirLista(Matricula matricula){
		if (indice < tamanhoCache) {
			matriculas[indice] = matricula;
			indice++;
		}	
	}
	
	public Matricula procurar(Aluno aluno, Curso curso) throws MatriculaNaoExistenteException{
		for (Matricula matricula: matriculas) {
			if (matricula != null && matricula.getAluno().equals(aluno) && matricula.getCurso().equals(curso)) {
				return matricula;
			}
		}
		throw new MatriculaNaoExistenteException();	
	}
	
	public void descadastrar(Matricula matricula) throws MatriculaNaoExistenteException{
		int i = procurarIndice(matricula.getNumero());
	
		matriculas[i] = matriculas[indice - 1];
		matriculas[indice - 1] = null;
		indice--;
	}
	
	public boolean existe(Matricula matricula){
		boolean resposta;
		
		try {
			procurarIndice(matricula.getNumero());
			resposta = true;
		} catch (MatriculaNaoExistenteException e) {
			resposta = false;
		}
		return resposta;
	}
	
	public void atualizarAluno(Aluno aluno){
		int i = 0;
		for (Matricula matricula : matriculas) {
			if (matricula != null && matricula.getAluno().getNome().equals(aluno.getNome())) {
				matriculas[i].setAluno(aluno); 
			}
			i++;
		}
	}
	
	public void atualizarCurso(Curso curso){
		int i = 0;
		for (Matricula matricula : matriculas) {
			if (matricula != null && matricula.getCurso().getCodigo().equals(curso.getCodigo())) {
				matriculas[i].setCurso(curso); 
			}
			i++;
		}
	}
}
